package com.demo.security.token;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.jsonwebtoken.Claims;

/**
 * 访问token,用于返回给前端
 * 请求接口,都需要协带此TOKEN,才能访问
 * @author molong
 * @since 2024/5/23
 */
public class JwtAccessToken extends JwtToken {

    /**
     * JWT协带的信息,理论上是可以不受限制添加各种参数的.
     */
    private transient Claims claims;

    /**
     * 创建一个TOKEN对象
     *
     * @param token  TOKEN值
     * @param claims TOKEN需要协带的参数
     */
    public JwtAccessToken(String token, Claims claims) {
        super(token);
        setClaims(claims);
    }


    /**
     * jwt签发者
     *
     * @return jwt签发者
     */
    public String getIss() {
        return claims.getIssuer();
    }

    /**
     * jwt的过期时间，这个过期时间必须要大于签发时间
     *
     * @return jwt的过期时间
     */
    public String getExp() {
        return DateUtil.format(claims.getExpiration(), DatePattern.NORM_DATETIME_PATTERN);
    }

    /**
     * jwt的签发时间
     *
     * @return jwt的签发时间
     */
    public String getIat() {
        return DateUtil.format(claims.getIssuedAt(), DatePattern.NORM_DATETIME_PATTERN);
    }

    /**
     * jwt的唯一身份标识，主要用来作为一次性token,从而回避重放攻击。
     *
     * @return jwt的唯一身份标识
     */
    public String getJti() {

        return claims.getId();
    }

    /**
     * 定义在什么时间之前，该jwt都是不可用的.
     *
     * @return jwt可用时间
     */
    public String getNbf() {
        return DateUtil.format(claims.getNotBefore(), DatePattern.NORM_DATETIME_PATTERN);
    }

    @JsonIgnore
    public Claims getClaims() {
        return claims;
    }

    private void setClaims(Claims claims) {
        this.claims = claims;
    }

}
